<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>对象克隆</title>
</head>
<body>
<script>
    let obj = {
        name: 'Jack',
        score: {
            math: 100,
            English: 120
        }
    }

    Object.defineProperty(obj, 'age', {
        value: 23,
        /*注意这里动态添加的属性enumerable一定要设置为true,不然无法被遍历到是不能使用assign进行拷贝的
        * */
        enumerable: true

    })


    /*
    *
    * 使用assign进行浅拷贝的话如果源对象身上使用defineProperty定义了属性的话无法被复制*/
    let obj1 = Object.assign({}, obj);
    console.log(Object.getOwnPropertyDescriptors(obj))
    console.log(Object.getOwnPropertyDescriptors(obj1))

    /*而使用这种方式的话源对象的属性描述符也会被复制*/
    let obj2 = Object.defineProperties({}, Object.getOwnPropertyDescriptors(obj))

    /*
      Object.defineProperties()函数不是一个纯函数，所以像下面这样写也是可以的
           let target = {}
     Object.defineProperties(target, Object.getOwnPropertyDescriptors(obj))*/

    console.log(Object.getOwnPropertyDescriptors(obj2))
    console.log(Object.getOwnPropertyDescriptors(target))

    /*
    * 最终版
    * 将obj 复制给一个新对象 连同obj的属性描述符和继承关系一同复制
    *
    * */

    let newObj = Object.create(Object.getPrototypeOf(obj), Object.getOwnPropertyDescriptors(obj))


</script>
</body>
</html>